#pragma once
#include "Character/Part.h"
#include "ProtoBuffer/AllProtocol.h"
//#include "AllProtocol.h"

#include <vector>


class PackagePart : public Part
{
	typedef void (PackagePart::*pFunc)(const char*, uint32_t);
	typedef std::map<uint32_t, pFunc> mapMsgFunc;
	mapMsgFunc   m_mapMsgfunc;

	//扩展物品结构(临时计算用的中间结构)
	struct SItemEx : public SItem
	{
		int32_t stackNum;	//堆叠数量
		uint8_t byType;		//类型 EItemType 枚举
		SItemEx() :stackNum(0), byType(0)
		{}
	};

	enum
	{
		ETimer_ID_Package_Fashion = 1,	//时装
		ETimer_ID_Package_GodEquip = 2,	//神装
	};

	typedef std::list<SItemEx> LIST_ITEM_EX;
	// label - LIST_ITEM_EX(标签-物品列表)
	typedef std::unordered_map<uint8_t, LIST_ITEM_EX> MAP_LABEL_LIST_ITEM_EX;
	// index - SItemEx
	typedef std::map<uint16_t, SItemEx> MAP_INDEX_ITEM_EX;
	// label - MAP_INDEX_ITEM_EX
	typedef std::map<uint8_t, MAP_INDEX_ITEM_EX > MAP_LABEL_MAP_INDEX_ITEM_EX;

	// label - LIST_ITEM(标签-物品列表)
	typedef std::unordered_map<uint8_t, LIST_ITEM> MAP_LABEL_LIST_ITEM;
	// index - SItem
	typedef std::map<uint16_t, SItem> MAP_INDEX_ITEM;

	//label - VEC_ITEM_PROTO_EX
	typedef std::unordered_map<uint8_t, VEC_ITEM_PROTO_EX> MAP_LABEL_VEC_ITEM_PROTO_EX;
	//index - ItemProtoInfo
	typedef std::map<uint16_t, ItemProtoInfo> MAP_INDEX_ITEM_PROTO_EX;

	// itemid - VEC_PACKAGE_ITEM
	typedef std::unordered_map<uint32_t, VEC_PACKAGE_ITEM> MAP_ITEM_PILE;
	// bybind - VEC_PACKAGE_ITEM
	typedef std::unordered_map<int8_t, VEC_PACKAGE_ITEM> MAP_BIND_PILE;
	// itemid - BIND_ITEM_PILE
	typedef std::unordered_map<uint32_t, MAP_BIND_PILE> MAP_ITEM_BIND_PILE;
	// label - MAP_ITEM_BIND_PILE
	typedef std::unordered_map<int8_t, MAP_ITEM_BIND_PILE> MAP_LABEL_MAP_ITEM_BIND_PILE;

	// index - CItemBase
	typedef std::unordered_map<uint16_t, CItemBase*> MAP_INDEX_ITEMBASE;
public:
	///////////////////////////////  Part  ///////////////////////////////////////////
	virtual bool Init(Creature *pMaster, uint32_t partType, CharacterDBInfo* pCharacterDB = nullptr);
	virtual bool UnInit();
	virtual bool OnMsgHandle(uint32_t cmd, const char* data, uint32_t len);
	virtual void OnExecute(uint16_t nEventID, uint64_t nSrcID, uint8_t bySrcType, void *pContext, int32_t nLen);
	virtual void OnTimer(uint32_t nTimerID);
	virtual bool SynOnLogin();
	virtual bool SaveDB(CharacterDBInfo& characterDB);
	///////////////////////////////// IPackage   /////////////////////////////////////////
	//获取指定物品数量
	virtual int32_t GetItemNum(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum);
	//是否存在物品
	virtual bool HasItem(LIST_ITEM &lstItem);
	//移除物品
	virtual bool RemoveItem(uint32_t nItemID, int32_t nNum, SItemSourceParam &sourceParam, int8_t byBind = (int8_t)EBindState::EBindState_all);
	//移除物品 sourceParam : 物品移除来源（暂时没有）
	virtual bool RemoveItem(LIST_ITEM &lstItem, SItemSourceParam &sourceParam);
	//移除物品 index,num sourceParam : 物品移除来源（暂时没有）
	virtual bool RemoveItemByIndex(uint16_t nIndex, int32_t nNum, SItemSourceParam &sourceParam);
	//移除物品 index-num nGetType : 物品移除来源（暂时没有）
	virtual bool RemoveItem(MAP_UINT16_INT32 &mapIndexItem, SItemSourceParam &sourceParam);
	//移除穿戴装备 index
	virtual bool RemovePlayerEquip(SET_UINT8 &setIdx);
	//是否能添加物品
	virtual bool CanAddItem(LIST_ITEM &lstItem);
	//能否添加物品
	virtual bool CanAddItem(VEC_ITEM_PROTO_EX &vecProtoItemsEx);
	//添加物品
	virtual bool AddItem(uint32_t nItemID, int32_t nNum, SItemSourceParam &sourceParam, int8_t byBind = (int8_t)EBindState::EBindState_no);
	//添加物品 sourceParam : 物品来源（暂时没有）
	virtual bool AddItem(LIST_ITEM &lstItem, SItemSourceParam &sourceParam, bool update = true);

	//添加物品 sourceParam : 物品来源（暂时没有）
	virtual bool AddItem(VEC_ITEM_PROTO &vecProtoItems, SItemSourceParam &sourceParam, bool update = true);
	//添加物品 sourceParam : 物品来源（暂时没有）
	virtual bool AddItem(VEC_ITEM_PROTO_EX &vecProtoItemsEx, SItemSourceParam &sourceParam, bool update = true);
	//添加物品 sourceParam : 物品来源（暂时没有） vecProtoItemsOut:传出参数，外部需要的物品数据
	virtual bool AddItem(VEC_ITEM_PROTO_EX &vecProtoItemsEx, VEC_ITEM_PROTO_EX &vecProtoItemsOut, SItemSourceParam &sourceParam, bool update = true);
	//清空背包所有物品
	virtual bool ClearPackage();
	//扩展背包
	virtual int32_t Expand(uint16_t nNum);
	//扩展仓库
	virtual int32_t ExpandStorage(uint16_t nNum);
	//获取装备信息
	virtual VEC_PLAYER_EQUIP *GetPlayerEquip();
	//获取索引位置物品
	virtual const CItemBase *GetItem(uint16_t nIndex);
	//获取物品（根据tem.xlsx 表中 subType 字段 获取物品, 只返回找到的第一个物品）
	virtual const CItemBase *GetItemByType(int32_t itemSubType);
	//移除所有指定类型的物品（根据 tem.xlsx 表中 subType 字段 移除物品）
	virtual bool RemoveAllByType(int32_t itemSubType, SItemSourceParam &sourceParam);
	//获取所有可掉落的穿戴装备
	virtual void GetAllCanDropEquip(VEC_COMMON_ITEM &vecEquip);
	//获取所有可掉落的背包物品
	virtual void GetAllCanDropPackage(VEC_COMMON_ITEM &vecPakcage);
	//获取外观
	virtual void GetFacade(uint32_t &clothesId,uint32_t &weaponId,uint32_t &wingId);
	//激活 nIdx:物品索引
	virtual int32_t Active(uint16_t nIdx);
	//取消激活 
	virtual void UnActive();
	//设置跑商资金 itemSubType:物品子类型 （根据tem.xlsx 表中 subType 字段， 只设置找到的第一个物品 ）
	virtual bool SetRunBusiness(uint16_t nIndex, int32_t fund);
	//设置跑商物品购买均价
	void SetRunAvePrice(int32_t count, int32_t money);
	//添加打造的物品
	virtual bool AddItemByMake(uint32_t nItemID, const char *szMaker, SItemCond &itemCond, SItemSourceParam &sourceParam, int8_t byBind = (int8_t)EBindState::EBindState_no);
	//使用物品 nIndex:物品所在背包索引,nNum:使用的数量,protoArg:使用物品需要的参数
	virtual int32_t UseItem(uint16_t nIndex, int32_t nNum, UseItemArgProto &protoArg);
	//添加装备穿在身上
	bool AddEquipOnBody(uint32_t equipConfigID);
	//是否已穿戴(装备、神装)
	bool IsEquipDress(uint32_t equipId);
	//是否已穿戴(时装)
	bool IsFashionDress(uint32_t fashionId);
	//身上的装备是否满足精炼等级在一个指定的区间
	bool RefineInLvl(uint16_t low, uint16_t up);
	//全身装备精炼等级之和
	uint32_t GetTolRefineLvl();
private:
	////////////////////////////////////  玩家背包逻辑  //////////////////////////////////////
	//单个标签页数据
	bool LabelItemInfo(uint8_t byLabel);
	//信息
	void ItemInfo(const char *data,uint32_t len);
	//整理
	void ItemSort(const char *data,uint32_t len);
	//出售
	void ItemSell(const char *data,uint32_t len);
	//更新回购列表
	void UpdateBuyBack(VEC_PACKAGE_ITEM &vec);
	//使用
	void ItemUse(const char *data,uint32_t len);
	//栏位信息
	void LabelInfo();
	//更新背包
	void UpdatePackageInfo(PackageUpdateRet &protoUpdate);
	//更新扩展
	bool UpdatePackageExpand();
	//拾取掉落
	void PickupDrop(const char *data, uint32_t len);
	//冷却信息
	void CoolInfo(const char *data, uint32_t len);

	///////////////////////////////////// 玩家装备逻辑     /////////////////////////////////////
	//装备信息
	void EquipInfo(const char *data, uint32_t len);
	//装备穿戴
	void EquipDress(const char *data, uint32_t len);
	
	//装备卸下
	void EquipUnDress(const char *data, uint32_t len);
	//更新装备
	bool UpdateEquipInfo(CEquip *pEquip, EEquipType etype = EEquipType_Equip);
	bool UpdateEquipInfo(PlayerEquipUpdateRet &update_ret);
	//更新装备槽位
	bool UpdateEquipSlot(EquipSlot &slot);
	bool UpdateEquipSlot(PlayerEquipSlotUpdateRet &update_ret);
	//统计当前穿戴装备
	void StatisticsEquip();
	///////////////////////////////////// 装备养成  /////////////////////////////////////
	//鉴定
	void EquipIdentify(const char *data, uint32_t len);
	//勾选
	void EquipSelect(const char *data, uint32_t len);
	//精炼
	void EquipRefine(const char *data, uint32_t len);
	//强化
	void EquipStren(const char *data, uint32_t len);
	//一键强化
	void EquipOneKeyStren(const char *data, uint32_t len);
	//镶嵌宝石
	void StoneInlay(const char *data, uint32_t len);
	//取下宝石
	void StoneTakeoff(const char *data, uint32_t len);
	//宝石合成
	void StoneCompose(const char *data, uint32_t len);
	//材料合成
	void MaterialCompose(const char *data, uint32_t len);
	//分解
	void EquipDecompose(const char *data, uint32_t len);
	//印刻符文(符文即是之前的神印石)
	void RuneUp(const char *data, uint32_t len);
	//摘除符文
	void RuneDown(const char *data, uint32_t len);

	///////////////////////////////////// 时装  /////////////////////////////////////
	//激活时装(使用)
	int32_t ActiveFashion(int32_t nItemID, uint32_t fashionId);
	//时装更新
	void NotifyFashion(CFashion &fashion, FashionOperateType operate/* int8_t operate*/);
	//时限
	void UpdateFashion();
	//穿戴
	void DressFashion(const char *data, uint32_t len);
	//卸下
	void UnDressFashion(const char *data, uint32_t len);
	//神装时限
	void UpdateGodEquip();
	///////////////////////////////////// 星魂传送  /////////////////////////////////
	//标记
	void StarSoulMark(const char *data, uint32_t len);
	//使用后处理
	void StarSoulUse(CItemBase *pItem);
	//响应
	void StarSoulResp(const char *data, uint32_t len);
	//使用
	int32_t OnStarSoul(int16_t nIndex);
	//中心服返回召唤结果
	void OnStarSoulRsp(int32_t ret, int16_t nIndex);
	//回购
	void RebuyBack(const char *data, uint32_t len);
	//回购
	void DelGodEquip(const char *data, uint32_t len);
private:
	//获取符文类型
	EItemRuneType TuneType(EItemSubType type);
	//add符文技能
	void AddRuneSkill(const ItemItemCfgInfo *pItemCfg/*, EItemRuneType runeType*/);
	//add符文技能--根据穿戴位置
	void AddRuneSkill(uint32_t runeItemId);
	//remove符文技能
	void RemoveRuneSkill(uint32_t item_id);
	//通过索引获取物品
	CItemBase *GetItemByIndex(int16_t nIndex);
	//设置物品
	uint16_t SetItemByIndex(uint16_t nIndex,CItemBase *pItem);
	//通过包裹类型获取物品 byPackageType:包裹类型 详见 EPackageType枚举, nIndex:对应包裹类型格子索引
	CItemBase *GetItemByPackageType(int8_t byPackageType,uint16_t nIndex);
	// 通过包裹类型设置物品 :包裹类型 详见 EPackageType枚举 , nIndex:对应包裹类型格子索引
	uint16_t SetItemByPackageType(int8_t byPackageType, uint16_t nIndex,CItemBase *pItem);
	//获取标签页空格子索引列表 nNum:为0表示标签页所有的空格子，大于0时 只返回 nNum 个空格子
	bool GetEmptyGrid(uint8_t byLabel, VEC_UINT16 &vecGrid,uint16_t nNum = 0);
	//获取某个物品剩余可叠加的数量
	int32_t GetItemLeftPile(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum,/* VEC_PACKAGE_ITEM &vecUnBindItem, VEC_PACKAGE_ITEM &vecBindItem,*/ ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas,int8_t byPackageType);
	//获取某个标签内物品剩余可叠加数量
	int32_t GetLabelItemLeftPile(uint8_t byLabel, uint32_t nItemID, int32_t stackLimit, int32_t &nUnBindNum, int32_t &nBindNum, /*VEC_PACKAGE_ITEM &vecUnBindItem, VEC_PACKAGE_ITEM &vecBindItem, */ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas, int8_t byPackageType);
	//通过格子索引获取标签
	uint8_t GetLabelByIndex(uint16_t nIndex);
	//是否是有效的索引
	bool ValidIndex(uint16_t nIndex);
	//通过包裹类型判断是否是有效的索引
	bool ValidIndexByPackageType(uint16_t nIndex, int8_t byPackageType);
	//是否是有效的标签页索引
	bool ValidLabelIndex(uint8_t byLabel,uint16_t nIndex);
	//通过包裹类型判断是否是有效的标签页索引
	bool ValidLabelIndexByPackageType(uint8_t byLabel, uint16_t nIndex, int8_t byPackageType);
	//是否是有效的包裹类型
	bool ValidPackageType(int8_t byPackageType);
	//是否是有效的标签页
	bool ValidLabel(uint8_t byLabel);	
	//获取标签页开启的格子数
	uint16_t GetLabelOpenGrid(uint8_t byLabel);
	//获取背包开启的格子数
	uint16_t GetOpenGrid();
	//获取标签页起始索引
	uint16_t GetLabelStartIdx(uint8_t byLabel);
	//获取标签页结束索引
	uint16_t GetLabelEndIdx(uint8_t byLabel);
	//通过包裹类型获取格子起始索引
	uint16_t GetLabelStartIdxByPackageType(uint8_t byLabel, int8_t byPackageType);
	//通过包裹类型获取格子结束索引
	uint16_t GetLabelEndIdxByPackageType(uint8_t byLabel, int8_t byPackageType);
	//获取指定物品绑定和非绑定数量
	int32_t GetPackageItemNum(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum);
	//获取当前可强化槽位列表
	void GetStrenthLelMap(uint32_t nPlayerLev, SET_UINT32 &iset);

	
	//获取背包指定物品绑定和非绑定数量
	int32_t GetPackageItemNum(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum, ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas);
	//获取仓库指定物品的绑定和非绑定数量
	int32_t GetStorageItemNum(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum, ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas);
	//获取指定物品绑定和非绑定数量
	int32_t GetBagItemNum(uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum, ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas, int8_t byPackageType);
	//获取指定物品绑定和非绑定数量
	int32_t GetLabelBagItemNum(int8_t byLabel, uint32_t nItemID, int32_t &nUnBindNum, int32_t &nBindNum, VEC_PACKAGE_ITEM &vecUnBindItem, VEC_PACKAGE_ITEM &vecBindItem, ORDER_MAP_UINT16_INT32 &mapUnbindGridHas, ORDER_MAP_UINT16_INT32 &mapBindGridHas, int8_t byPackageType);
	//是否存在物品
	bool HasBagItem(const LIST_ITEM &lstItem, ORDER_MAP_UINT16_INT32 &mapGridReduceNum,int8_t byPackageType);
	//是否存在物品
	bool HasBagItem(const MAP_UINT16_INT32 &mapIdxNum, ORDER_MAP_UINT16_INT32 &mapGridReduceNum, int8_t byPackageType);
	//移除物品
	bool RemoveBagItem(ORDER_MAP_UINT16_INT32 &mapGridReduceNum,MAP_UINT32_INT32 &mapItemNum, int8_t byPackageType);
	//背包是否存在物品
	bool HasPackageItem(const LIST_ITEM &lstItem, ORDER_MAP_UINT16_INT32 &mapGridReduceNum);
	//背包是否存在物品
	bool HasPackageItem(const MAP_UINT16_INT32 &mapIdxNum, ORDER_MAP_UINT16_INT32 &mapGridReduceNum);
	//仓库是否存在物品
	bool HasStorageItem(const LIST_ITEM &lstItem, ORDER_MAP_UINT16_INT32 &mapGridReduceNum);
	//仓库是否存在物品
	bool HasStorageItem(const MAP_UINT16_INT32 &mapIdxNum, ORDER_MAP_UINT16_INT32 &mapGridReduceNum);
	//移除背包物品
	bool RemovePackageItem(ORDER_MAP_UINT16_INT32 &mapGridReduceNum, MAP_UINT32_INT32 &mapItemNum);
	//移除仓库物品
	bool RemoveSotrageItem(ORDER_MAP_UINT16_INT32 &mapGridReduceNum, MAP_UINT32_INT32 &mapItemNum);
	//移除物品事件处理
	void OnRemoveItemEvent(MAP_UINT32_INT32 &mapItemNum, SItemSourceParam &sourceParam);

	//合并背包物品列表
	void MergePackageItemList(LIST_ITEM &inlstItem, VEC_ITEM_PROTO_EX &vecinProtoEx, MAP_LABEL_LIST_ITEM_EX &mapOutLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapOutLabelVecItemProtoEx);
	//合并仓库物品列表
	void MergeStorageItemList(LIST_ITEM &inlstItem, VEC_ITEM_PROTO_EX &vecinProtoEx, MAP_LABEL_LIST_ITEM_EX &mapOutLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapOutLabelVecItemProtoEx);
	//合并物品列表
	void MergeItemList(LIST_ITEM &inlstItem, VEC_ITEM_PROTO_EX &vecinProtoEx, MAP_LABEL_LIST_ITEM_EX &mapOutLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapOutLabelVecItemProtoEx, int8_t byPackageType);
	//能否添加到背包  mapOutGridAddNum:可堆叠的格子，每个格子上增加的数量 index - num
	bool CanBagAddItem(MAP_LABEL_LIST_ITEM_EX &mapInLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapInLabelVecItemProtoEx, MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx, int8_t byPackageType);
	//能否添加进背包
	bool CanPackageAddItem(MAP_LABEL_LIST_ITEM_EX &mapInLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapInLabelVecItemProtoEx, MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx);
	//仓库能否加物品
	bool CanStorageAddItem(MAP_LABEL_LIST_ITEM_EX &mapInLabelItem, MAP_LABEL_VEC_ITEM_PROTO_EX &mapInLabelVecItemProtoEx, MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx);
	//添加背包物品
	bool AddPackageItem(MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx, bool update = true);
	//添加仓库物品
	bool AddStorageItem(MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx, bool update = true);
	//添加背包物品
	bool AddPackageItem(MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx, int8_t byPackageType, bool update);
	//添加物品事件处理
	void OnAddItemEvent(MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx,SItemSourceParam &sourceParam);
	//填充传出参数
	void OnAddItemParam(MAP_UINT16_INT32 &mapOutGridAddNum, MAP_INDEX_ITEM_PROTO_EX &mapOutNewIdxItemProtoEx, VEC_ITEM_PROTO_EX &vecProtoExParam);

	//物品日志
	void ItemLog(LogTid tid, MAP_UINT16_INT32 &items, uint32_t source);
	void ItemLog(LogTid tid, MAP_UINT32_INT32 &items, uint32_t source);

	//包裹整理
	bool BagItemSort(int8_t byPackageType);
	//堆叠合并
	uint16_t PileMerge(VEC_PACKAGE_ITEM vecItems,VEC_ITEM_PROTO_EX &vecPileProtoEx);

	//添加更新信息
	bool AddUpdateInfo(CItemBase *pItem, PackageUpdateInfo *protoInfo,bool bDel = false);
	//添加背包更新信息
	bool AddPackageUpdateInfo(CItemBase *pItem, PackageUpdateRet &ret, bool bDel = false);

	//添加收集物品（主要是用于任务收集物品）
	void AddCollectItem(uint32_t nItemID, int32_t nNum, MAP_UINT32_INT32 &mapCollectItems);
	//收集物品事件触发
	void CollectItemEvent(MAP_UINT32_INT32 &mapCollectItems, SItemSourceParam &sourceParam, int32_t nOperateType = EItemOpetateType_None);
	//第一次登陆
	void FirstLogin();

	////////////////////////////////  仓库接口 //////////////////////////////////////////
	//是否是有效的索引
	bool ValidStorageIndex(uint16_t nIndex);
	//设置物品
	uint16_t SetStorageItemByIndex(uint16_t nIndex, CItemBase *pItem);
	//通过索引获取物品
	CItemBase *GetStorageItemByIndex(int16_t nIndex);
	//获取仓库开始索引
	uint16_t GetStorageStartIdx();
	//获取仓库结束索引
	uint16_t GetStorageEndIdx();
	//获取仓库空格子索引列表
	bool GetStorageEmptyGrid(VEC_UINT16 &vecGrid, uint16_t nNum = 0);
	//添加仓库物品
	bool AddStorageItem(VEC_ITEM_PROTO_EX &vecProtoEx);
	//移除仓库物品
	bool RemoveStorageItem(MAP_UINT16_INT32 &mapIndexItem);
	//
	//设置仓库更新信息
	bool AddStorageUpdateInfo(CItemBase *pItem, StorageUpdateRsp &ret, bool bDel = false);

	//仓库信息
	void StorageInfo(const char *data, uint32_t len);
	//仓库整理
	void StorageSort(const char *data, uint32_t len);
	//仓库操作（移入，移出）
	void StorageOperate(const char *data, uint32_t len);
	//仓库更新
	void StorageUpdate(StorageUpdateRsp &ret);
	//更新仓库扩展
	bool UpdateStorageExpand();
private:
	//设置更新信息
	bool SetUpdateItemInfo(CItemBase *pItem, ItemProtoInfo *protoItemInfo, bool bDel = false);
	//设置槽位信息
	void SetEquipSlotInfo(EquipSlot &slot, EquipSlotProto *protoSlot);
	//是否是有效的装备位置
	bool ValidEquipPos(uint8_t byPos);
	//是否是装备外观的位置
	bool ValidEquipFacadePos(uint8_t byPos);
	//获取装备
	CEquip *GetEquip(uint8_t byPos, EEquipType eType = EEquipType_Equip);
	//计算装备属性
	bool CalcEquipAttr(bool bSync = true);
	//计算套装属性
	void CalcSuitAttr(MAP_UINT32_VEC_UINT32 &suitVec, MAP_INT32_FLOAT &attr, int32_t nPNumEquipBegin, int32_t nPNumEquipEnd);
	//神装、装备
	uint16_t SetEquipByIndex(uint8_t byPos, CEquip *pItem, EEquipType eType = EEquipType_Equip);
	//添加装备更新信息
	bool AddPlayerEquipUpdateInfo(CItemBase *pItem, PlayerEquipUpdateRet &ret, bool bDel = false);
	//获取神印石技能信息
	bool GetHolySkillParam(uint32_t nHolyItemID,uint32_t &nHolySkillID,uint32_t &nHolySKillLev,uint32_t &nHolySkillCd);
	//同步装备数据到中心服
	void SyncPlayerEquip(VEC_PLAYER_EQUIP &vecUpdateEquip,bool bAll = false);
	//是否在冷却中  itemId_cdGroupId: 物品ID或者冷却组ID, curMsec:当前的unix毫秒数
	bool IsInCd(uint32_t itemId_cdGroupId);
	//检查所有的
	void CheckAllCd();
	//清空索引记录
	void ClearIdxRecord();
	//get 索引记录
	SET_UINT16& GetIdxRecord();
	//外观改变事件
	void FacadeChange(bool calcRefine = false/*是否计算精炼特效*/);
	//使用物品
	int32_t UseItem(CItemBase *pItem, int32_t nNum, UseItemArgProto protoArg);
public:
	//更新冷却
	void UpdateCd(uint32_t itemId_cdGroupId);
	//获取装备信息 add by lian
	void GetEquipInfo(::google::protobuf::RepeatedPtrField< ::ProtoBuf::ItemProtoInfo >& equipInfo);
	//获取装备槽位信息
	void GetEquipSlotInfo(::google::protobuf::RepeatedPtrField< ::ProtoBuf::EquipSlotProto >& equipSlot);
	//获取模型信息 add by lian
	void GetFacade(CharFacadeProto& facadeProto);
	//更新外观信息
	void UpdateFacade();
	//获取装备符文
	void GetRuneItemId(uint32_t &dwRuneItemId, uint32_t &ykRuneItemId);
	//GM 设置藏宝图区域 add by zlb
	bool SetTreasureArea(int32_t item_idx, uint32_t areaId);
	//get回购列表
	void GetSellItems(PlayerSellBackItem& sellItem);
	//set回购列表
	void SetSellItems(const PlayerSellBackItem& sellItem);
public:
	PackagePart();
	virtual ~PackagePart();
private:
	uint64_t m_nLastSortTime;						//上次整理的时间
	uint16_t m_nExpandNum;							//扩展格子数
	uint16_t m_nLabelOpenGrid[EPackageLabel_limit];	//标签页开启格子数
	uint16_t m_nOpenGrid;							//背包开启格子数
	VEC_PACKAGE_ITEM m_vecItems;					//背包数据
	VEC_PLAYER_EQUIP m_vecPlayerEquip;				//角色装备
	VEC_PLAYER_EQUIP m_vecPlayerGodEquip;			//角色神装
	VEC_PLAYER_FASHION m_vecPlayerFashion;			//角色时装
	VEC_EQUIP_SLOT	m_vecEquipSlot;					//装备槽位信息列表
	MAP_UINT32_UINT64 m_mapItemCd;					//物品和物品组冷却
	SET_UINT16	m_setIdxRecord;						//记录每次加物品 数量有增加的格子索引，在每次加物品之前先清空
	EquipFacadeInfo m_equipFacade;					//外观信息

	VEC_PACKAGE_ITEM  m_vecStorage;					//仓库数据
	int32_t m_storageExpand;						//仓库扩充数量
	uint64_t m_lastStorageSort;						//上次仓库整理的时间
	std::deque<CItemBase*>	m_dequeRebuyItem;		//回购物品列表
};
